Lambda のランタイムを変更する方法を教えてください
困っていた内容
AWS から 現在使用している Lambda のランタイムを更新するよう通知が来ました。
Lambda のランタイムを更新するために、新しいランタイムに変更したいのですが、どのように変更すればよいのか教えてください。
どう対応すればいいの?
Lambda のマネジメントコンソールおよび Lambda の UpdateFunctionConfiguration API を使用して変更できます。
ランタイムまたはランタイムバージョンを変更するには
1.Lambda コンソールの [Functions] (関数) ページを開きます。
2.更新する関数を選択し、[Code] (コード) タブを選択します。
3.コードエディタの下にある [Runtime settings] (ランタイム設定) セクションまで下にスクロールします。
4.[Edit] を選択します。
5.[Runtime] (ランタイム) で、ランタイムのバージョンを選択します。
6.[Handler] (ハンドラ) で、関数のファイル名とハンドラを指定します。
7.アーキテクチャで、関数に使用する命令セットアーキテクチャを選択します。
8.[Save] を選択します。
やってみた
せっかくなので、以下の 5 つのパターンでランタイムを変更してみます。
1.Lambda のマネジメントコンソール
2.AWS CLI
3.CloudFormation
4.AWS SDK for JavaScript
5.AWS SDK for Python (Boto3)
1.Lambda のマネジメントコンソール
まずは、AWS 公式ドキュメントにも記載のある、Lambda のマネジメントコンソールでの変更をやってみます。
サンプルの関数として、ランタイムは Node.js 12.x で作成しました。
この関数のランタイムを、Node.js 16.x に変更してみます。
「ランタイム設定」右上の「編集」をクリックします。
ランタイムの一覧から「Node.js 16.x」を選択します。
その他の設定は変更せず、「保存」をクリックします。
画面上部に「関数 {関数名} が更新されました。」と表示され、ランタイムも Node.js 16.x に変更されました。
以上が Lambda のマネジメントコンソールでの変更手順です。
2.AWS CLI
AWS CLI での変更には、update-function-configuration コマンドを使用します。
ランタイムを変更する場合は、--runtime
オプションを使用します。
今回は CloudShell から以下のコマンドで、再度サンプル関数のランタイムを Node.js 12.x から Node.js 16.x に変更してみます。
aws lambda update-function-configuration \ --function-name Test \ --runtime nodejs16.x
コマンドの実行に成功し、レスポンスからもランタイムが Node.js 16.x に変更されていることがわかります。
以上が AWS CLI での変更手順です。
3.CloudFormation
CloudFormation で Lambda を構築している場合もあると思うので、CloudFormation からもランタイムを変更してみます。
CloudFormation の場合は、AWS::Lambda::Function の Runtime
を変更します。
まずは変更前の Node.js 12.x のサンプル関数を、以下のテンプレートで作成します。
AWSTemplateFormatVersion: "2010-09-09" Resources: LambdaFunction: Type: "AWS::Lambda::Function" Properties: FunctionName: "Test" Handler: "index.handler" Architectures: - "x86_64" Code: ZipFile: | exports.handler = async (event) => { // TODO implement const response = { statusCode: 200, body: JSON.stringify('Hello from Lambda!'), }; return response; }; MemorySize: 128 Role: !Sub "arn:aws:iam::${AWS::AccountId}:role/makoto-LambdaBasicExecutionRole" Runtime: "nodejs12.x" Timeout: 3 TracingConfig: Mode: "PassThrough" EphemeralStorage: Size: 512
CloudFormation での関数作成後、Runtime
を nodejs16.x に変更し、スタックを更新します。
AWSTemplateFormatVersion: "2010-09-09" Resources: LambdaFunction: Type: "AWS::Lambda::Function" Properties: FunctionName: "Test" Handler: "index.handler" Architectures: - "x86_64" Code: ZipFile: | exports.handler = async (event) => { // TODO implement const response = { statusCode: 200, body: JSON.stringify('Hello from Lambda!'), }; return response; }; MemorySize: 128 Role: !Sub "arn:aws:iam::${AWS::AccountId}:role/makoto-LambdaBasicExecutionRole" Runtime: "nodejs16.x" ←ここだけ変更 Timeout: 3 TracingConfig: Mode: "PassThrough" EphemeralStorage: Size: 512
既存のテンプレートを置き換えて更新します。
スタックの更新が完了し、ランタイムが変更されていることを Lambda コンソールなどで確認してください。
以上が CloudFormation での変更手順です。
4.AWS SDK for JavaScript
コードでランタイムの変更をすることは少ないかと思いますが、やろうと思えばできるので、参考程度に紹介しておきます。
AWS SDK for JavaScript では、updateFunctionConfiguration を使用します。
今回は別の Lambda から以下のコードで、サンプル関数のランタイムを更新します。
const AWS = require("aws-sdk"); AWS.config.update({ region: "ap-northeast-1" }); AWS.config.apiVersions = { lambda: "2015-03-31", }; const lambda = new AWS.Lambda(); exports.handler = async (event) => { const params = { FunctionName: "Test", Runtime: "nodejs16.x", }; const result = await lambda.updateFunctionConfiguration(params).promise(); console.log(JSON.stringify(result, null, 2)); return; };
実行ログは以下の通りです。
{ "FunctionName": "Test", "FunctionArn": "arn:aws:lambda:ap-northeast-1:{account-id}:function:Test", "Runtime": "nodejs16.x", "Role": "arn:aws:iam::{account-id}:role/makoto-LambdaBasicExecutionRole", "Handler": "index.handler", "CodeSize": 304, "Description": "", "Timeout": 3, "MemorySize": 128, "LastModified": "2022-08-17T07:51:47.000+0000", "CodeSha256": "1LbkWTlxbeGxWCDcSB1hyIcv/HzJ6W3w6sibCRvjfAU=", "Version": "$LATEST", "KMSKeyArn": null, "TracingConfig": { "Mode": "PassThrough" }, "MasterArn": null, "RevisionId": "66f28a04-eeee-4541-9c1c-3e64e6030791", "State": "Active", "StateReason": null, "StateReasonCode": null, "LastUpdateStatus": "InProgress", "LastUpdateStatusReason": "The function is being created.", "LastUpdateStatusReasonCode": "Creating", "PackageType": "Zip", "SigningProfileVersionArn": null, "SigningJobArn": null, "Architectures": ["x86_64"] }
以上が AWS SDK for JavaScript での変更手順です。
5.AWS SDK for Python (Boto3)
AWS SDK for Python (Boto3) では、update_function_configuration を使用します。
AWS SDK for JavaScript のパターン同様、別の Lambda から以下のコードで、サンプル関数のランタイムを更新します。
import json import boto3 client = boto3.client('lambda') def lambda_handler(event, context): response = client.update_function_configuration( FunctionName='Test', Runtime='nodejs16.x' ) print(json.dumps(response)) return;
実行ログは以下の通りです。
{ "ResponseMetadata": { "RequestId": "89372622-db1a-4238-a629-9bd4a93eb3fd", "HTTPStatusCode": 200, "HTTPHeaders": { "date": "Thu, 18 Aug 2022 00:23:44 GMT", "content-type": "application/json", "content-length": "976", "connection": "keep-alive", "x-amzn-requestid": "89372622-db1a-4238-a629-9bd4a93eb3fd" }, "RetryAttempts": 0 }, "FunctionName": "Test", "FunctionArn": "arn:aws:lambda:ap-northeast-1:{account-id}:function:Test", "Runtime": "nodejs16.x", "Role": "arn:aws:iam::{account-id}:role/makoto-LambdaBasicExecutionRole", "Handler": "index.handler", "CodeSize": 304, "Description": "", "Timeout": 3, "MemorySize": 128, "LastModified": "2022-08-18T00:23:44.000+0000", "CodeSha256": "1LbkWTlxbeGxWCDcSB1hyIcv/HzJ6W3w6sibCRvjfAU=", "Version": "$LATEST", "TracingConfig": { "Mode": "PassThrough" }, "RevisionId": "41693e84-63d5-4820-8943-0050f1d75ed7", "State": "Active", "LastUpdateStatus": "InProgress", "LastUpdateStatusReason": "The function is being created.", "LastUpdateStatusReasonCode": "Creating", "PackageType": "Zip", "Architectures": ["x86_64"] }
以上が AWS SDK for Python (Boto3) での変更手順です。
注意点
Lambda のランタイムを変更する場合には、変更後のランタイムとソースコードの互換性があるか、開発環境などで十分検証してから変更することをお勧めします。